package config

// 使用Viper加载配置文件
import (
	"fmt"
	"log"
	"os"
	"path/filepath"

	"github.com/spf13/viper"
)

func getProjectRoot() (string, error) {
	_, err := os.Getwd()
	if err != nil {
		return "", err
	}

	currentDir, err := os.Getwd()
	if err != nil {
		return "", err
	}

	for {
		// 检查当前目录是否包含 go.mod 文件
		if _, err := os.Stat(filepath.Join(currentDir, "go.mod")); err == nil {
			return currentDir, nil
		}

		// 如果没有找到 go.mod 文件，则向上一级目录查找
		nextDir := filepath.Dir(currentDir)
		if nextDir == currentDir {
			break // 防止无限循环
		}
		currentDir = nextDir
	}

	return "", fmt.Errorf("could not find project root")
}

func GetConfig() {
	root, err := getProjectRoot()
	if err != nil {
		log.Fatalf("Error finding project root: %v", err)
	}

	configPath := filepath.Join(root, "config")

	viper.SetConfigName("global-conf") // 设置配置文件名（不带扩展名）
	viper.SetConfigType("yaml")        // 如果需要指定配置文件类型
	viper.AddConfigPath(configPath)    // 添加配置文件搜索路径

	// 尝试读取配置文件
	if err := viper.ReadInConfig(); err != nil {
		log.Fatalf("Error reading config file: %v", err)
	}

	// 获取用户配置
	userConfig := viper.AllSettings()

	// 初始化默认配置文件
	DefaultConfig()

	// 合并用户配置到默认配置 防止未设置的配置项被覆盖为空
	if err := viper.MergeConfigMap(userConfig); err != nil {
		log.Fatalf("Unable to merge config: %v", err)
	}

	// 解码合并后的配置到结构体
	if err := viper.Unmarshal(GlobalConfig); err != nil {
		log.Fatalf("Unable to decode into struct: %v", err)
	}
}
